home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FM Towns: Free Software Collection 9
/
FM Towns Free Software Collection 9.iso
/
t_os
/
tool
/
vdgear
/
src
/
play.c
< prev
next >
Wrap
Text File
|
1994-11-16
|
7KB
|
345 lines
/*
* VIDEO GEAR
* "play.c"
* by Good-Chy
*/
#include "video.h"
char *sc1, *sc2, *sc3;
int mos_ctrl;
int fade_count;
int mos_wait()
{
int x,y,ch;
do /* マウスが離されるのを待つ */
{
MOS_rdpos(&ch,&x,&y);
} while(ch != 0);
do /* マウスが押されるのを待つ */
{
MOS_rdpos(&ch,&x,&y);
} while(ch == 0);
return ch;
}
void superimpose_bit(char *p)
{
int x,y,i;
x = WORD(p+0)+1;
y = WORD(p+2)+1;
for (i=0 ; i<(y*x*2) ; i++, i++)
{
if ((*(p+i+6) == 0) && (*(p+i+7) == 0))
{ *(p+i+7) = 0x80; }
}
}
int load_next_picture(int stp)
{
int i,x1,y1,x2,y2;
char *p;
if (stp < 48)
{
EGB_writePage(egb_work,0x80);
EGB_color(egb_work,1,0x8000);
for (i=stp; i<48 ; i++)
{
if (data[i].picture.flag == 1)
{
if (strcmp(data[i].picture.name,"消去") == 0)
{
EGB_clearScreen(egb_work);
return (i+1);
}
else
{
EGB_clearScreen(egb_work);
p = tiff_load(data[i].picture.name);
if (p != NULL)
{
x1 = data[i].picture.x*2;
y1 = data[i].picture.y*2;
x2 = WORD(p+0) + x1;
y2 = WORD(p+2) + y1;
superimpose_bit(p);
put_vram((p+6),x1,y1,x2,y2);
free(p);
}
return (i+1);
}
}
}
}
return (48);
}
void play_init()
{
if (av_flag == 1) /* メモリが多い */
{
EGB_writePage(egb_work,0x81);
sc1 = get_vram(32,0,0,319,239);
EGB_writePage(egb_work,0x80);
sc2 = get_vram(16,0,0,639,479);
EGB_writePage(egb_work,0);
EGB_getPalette(0,pal_buff);
sc3 = get_vram(16,0,0,639,479);
}
else /* メモリが少ない */
{
EGB_writePage(egb_work,0x81);
sc1 = get_vram(32,0,60,319,239);
}
screen2();
mos_ctrl = MOS_getControl(); /* MOS_disp 無効 */
MOS_setControl(mos_ctrl & 0xfffffffe);
EGB_superImpose(egb_work,sp_light);
SND_elevol_set(0,127,127);
sprint(" エディタで設定した内容を ",32, 96,0x7fff,0,16,16,9);
sprint(" 左クリックごとに実行します ",32,112,0x7fff,0,16,16,9);
sprint(" 又、右クリックで終了です ",32,128,0x7fff,0,16,16,9);
}
void effect_play(int i, int j)
{
int fc;
switch(i)
{
case 1:fc = 3; stripe1(j); break;
case 2:fc = 4; stripe2(j); break;
case 3:fc = 5; wipe_up(j); break;
case 4:fc = 2; zoom_in(j); break;
case 5:fc = 2; verchcal_open(j); break;
case 6:fc = 5; wipe_down(j); break;
case 7:fc = 2; zoom_out(j); break;
case 8:fc = 2; verchcal_close(j); break;
case 9:fc = 4; wipe_left(j); break;
case 10:fc = 10; dizorve1(j); break;
case 11:fc = 4; hrizontal_open(j); break;
case 12:fc = 4; wipe_right(j); break;
case 13:fc = 10; dizorve2(j); break;
case 14:fc = 4; hrizontal_close(j); break;
case 15:fc = 1; nothing(j); break;
}
fade_count = fc*fade_speed;
}
void cd_fade_init(int loop)
{
switch(data[loop].cd.state)
{
case 0: /* プレイ */
{
SND_elevol_set(1,max_vol,max_vol);
play_cd_da(data[loop].cd.track);
break;
}
case 1: /* ストップ */
{
cdr_pause(0);
break;
}
case 2: /* フェ-ドイン */
{
SND_elevol_set(1,0,0); /* ボリュ-ム最小 */
cd_vol = 0;
play_cd_da(data[loop].cd.track);
flag[2] = 1;
break;
}
case 3: /* フェ-ドアウト */
{
cd_vol = max_vol;
flag[2] = 1;
break;
}
}
}
void cd_fade_in()
{
cd_vol++;
SND_elevol_set(1,cd_vol,cd_vol);
if (cd_vol >= max_vol) { flag[2] = 0; }
}
void cd_fade_out()
{
cd_vol--;
SND_elevol_set(1,cd_vol,cd_vol);
if (cd_vol <= 0)
{
cdr_pause(0);
flag[2] = 0;
}
}
/******************************************************************************
* プレイ・メイン
*/
void play()
{
unsigned drive,drives;
int i,loop,lp,fwait,ewait;
max_vol = 127;
cd_vol = 0;
play_init(); /* スタンバイ */
cdr_mstop(0);
lp = load_next_picture(0);
for (loop=0 ; loop<48 ; loop++)
{
if (data[loop].cd.flag == 1)
{
play_cd_da(data[loop].cd.track);
cdr_pause(0);
break;
}
}
EGB_writePage(egb_work,0);
sprint("それでは、ビデオ機器の用意をして",32,152,0x7fff,0,16,16,9);
sprint(" 左クリックでスタ-トです ",32,168,0x7fff,0,16,16,9);
if (mos_wait() == 1)
{
EGB_color(egb_work,1,0x8000);
EGB_clearScreen(egb_work);
for (loop=0 ; loop<48 ; loop++)
{
flag[0] = 0; flag[1] = 0; flag[2] = 0;
fade_count = 1;
ewait = 1;
if (data[loop].mixing.flag == 1) /* ミキシングが設定 */
{ vol_set(loop); }
if (data[loop].sound.flag == 1) /* 効果音の読み込み */
{
free(snd_bp);
snd_bp = snd_load(data[loop].sound.name);
}
if (data[loop].effect.flag == 1) /* ビデオ画像が設定 */
{
EGB_writePage(egb_work,1);
EGB_dezitize(egb_work,1);
EGB_dezitize(egb_work,0);
if (data[loop].effect.spimpose == 0)
{ EGB_superImpose(egb_work,sp_light); }
else { EGB_superImpose(egb_work, 0); }
if (mos_wait() == 2) { break; }
flag[0] = 2;
}
if (data[loop].picture.flag == 1) /* パソコン画像が設定 */
{ flag[1] = 2; }
if (data[loop].sound.flag == 1) /* 効果音の再生 */
{
if (snd_bp == NULL)
{ snd_bp = malloc(1); } /* dummy */
else { snd_play(snd_bp,data[loop].sound.vol); }
}
if (data[loop].cd.flag == 1) /* CDが設定 */
{
cd_fade_init(loop);
fwait = 1;
}
/* ステップ内でのル-プ */
while((flag[0] > 1) || (flag[1] > 1) || (flag[2] != 0))
{
ewait--;
if (ewait == 0)
{
ewait = effect_speed*150-149;
if (flag[0] > 1) /* ビデオ画像のエフェクト中 */
{
effect_play(data[loop].effect.effect,0);
}
if (flag[1] > 1) /* パソコン画のエフェクト中 */
{
effect_play(data[loop].picture.effect,1);
}
}
if (flag[2] != 0) /* CDフェ-ド */
{
if ((flag[0] < 2) && (flag[1] < 2))
{
fwait = 1;
for (i=0 ; i<fade_speed ; i++)
{ wait_vsync(); }
}
fwait--;
if (fwait == 0)
{
fwait = fade_count + effect_speed*150-149;
switch(data[loop].cd.state)
{
case 2:cd_fade_in(); break;
case 3:cd_fade_out(); break;
}
}
}
}
if (flag[1] == 1) /* パソコン画像読み込み */
{ lp = load_next_picture(lp); }
if (mos_wait() == 2) { break; }
}
}
EGB_superImpose(egb_work,0);
screen1();
MOS_setControl(mos_ctrl); /* MOS_disp復活 */
mos_init();
cdr_mstop(0);
snd_init();
if (av_flag == 1) /* メイン画面の復活 */
{
EGB_writePage(egb_work,0x81);
put_vram(sc1,0,0,319,239);
EGB_writePage(egb_work,0x80);
put_vram(sc2,0,0,639,479);
EGB_writePage(egb_work,0);
EGB_palette(egb_work,1,pal_buff);
put_vram(sc3,0,0,639,479);
free(sc1);
free(sc2);
free(sc3);
}
else
{
drive = *(work_path) - 'A' + 1;
_dos_setdrive(drive,&drives);
_chdir(work_path);
main_screen_load();
EGB_writePage(egb_work,0x81);
put_vram(sc1,0,60,319,239);
free(sc1);
}
step_print();
}